package com.zbkj.service.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.github.pagehelper.PageInfo;
import com.zbkj.common.model.card.StoreGiftCard;
import com.zbkj.common.model.card.StoreGiftCardUser;
import com.zbkj.common.page.CommonPage;
import com.zbkj.common.request.PageParamRequest;
import com.zbkj.common.request.StoreGiftCardUserSearchRequest;
import com.zbkj.common.request.UserGiftCardReceiveRequest;
import com.zbkj.common.response.StoreGiftCardInfoResponse;
import com.zbkj.common.response.StoreGiftCardUserResponse;
import com.zbkj.common.vo.GiftCardExportVo;
import com.zbkj.common.vo.MyRecord;

import java.util.HashMap;
import java.util.List;

/**
 * StoreGiftCardUser 服务层接口
 *
 * @author Swallows
 * @date 2022-08-19 09:51
 */
public interface StoreGiftCardUserService extends IService<StoreGiftCardUser> {

    /**
     * 分页查询礼品卡发放记录
     *
     * @param searchRequest 查询条件
     * @param pageParamRequest 分页条件
     * @return 分页列表
     */
    PageInfo<StoreGiftCardUserResponse> getPageList(StoreGiftCardUserSearchRequest searchRequest, PageParamRequest pageParamRequest);

    /**
     * 后台制卡
     *
     * @param giftCard 礼品卡模版参数
     * @param nums 制卡数量
     * @return 操作结果
     */
    List<GiftCardExportVo> makeCards(StoreGiftCard giftCard, Integer nums);

    /**
     * 后台发卡操作
     *
     * @param uid 用户id
     * @param cardUserList 卡片id
     * @return 操作结果
     */
    boolean deliver(String uid, String cardUserList);

    /**
     * 获取可以发放的礼品卡列表
     *
     * @return 礼品卡列表
     */
    List<StoreGiftCardUser> getDeliverList();

    /**
     * 获取用户已经领取的礼品卡
     *
     * @param uid 用户id
     * @return 礼品卡map
     */
    HashMap<Integer, StoreGiftCardUser> getMapByUserId(Integer uid);

    /**
     * 获取可用礼品卡数量
     *
     * @param uid 用户uid
     */
    Integer getUseCount(Integer uid);

    /**
     * 获取我的礼品卡列表
     *
     * @param type 类型，usable-可用，unusable-不可用
     * @param pageParamRequest 分页查询条件
     * @return 列表
     */
    CommonPage<StoreGiftCardUserResponse> getMyGiftCardList(String type, PageParamRequest pageParamRequest);

    /**
     * 优惠券过期定时任务
     */
    void overdueTask();

    /**
     * 用户领取礼品卡
     */
    Boolean receiveGiftCard(UserGiftCardReceiveRequest request);

    /**
     * 购买会员后赠送相应礼品卡
     *
     * @param cardId 礼品卡模版id
     * @param uid  用户uid
     * @param nums 发放数量
     * @return MyRecord
     */
    MyRecord buyMemberGiveAway(Integer cardId, Integer uid, Integer nums);

    /**
     * 根据uid获取列表
     * @param uid uid
     * @param pageParamRequest 分页参数
     */
    List<StoreGiftCardUser> findListByUid(Integer uid, PageParamRequest pageParamRequest);

    /**
     * 使用礼品卡
     *
     * @param request 使用礼品卡请求参数
     * @return 礼品卡详情
     */
    StoreGiftCardInfoResponse useCard(UserGiftCardReceiveRequest request);

    /**
     * 下单后核销礼品卡
     *
     * @param id 礼品卡id
     * @return 操作结果
     */
    boolean updateStatus(Integer id);

    /**
     * 储值类型礼品卡核销
     * @return true -- 成功 false -- 失败
     */
    boolean verification();

    /**
     * 获取赠送礼品卡key
     */
    String getShareKey(Integer cardId);

    /**
     * 领取礼品卡
     */
    boolean draw(String key) throws Exception;

    /**
     * 礼品卡领取过期定时任务
     */
    void expireTask();
}
